# -*- encoding: utf-8 -*-
import time
import sys
from osv import fields, osv
from tools.translate import _
import pdb
import logging


class LoaiPhongTrao(osv.osv):
    _name = 'ctsv.loaiphongtrao'
    _description = 'Loai phong trao'
    _columns = {
        'name' : fields.char('Tên loại phong trào', size = 64, required = True),
        'total_mark' : fields.float('Tổng số điểm tối đa', digits=(12,2)),
        }
    _defaults = {}
    
LoaiPhongTrao()

class PhongTrao_Temp(osv.osv):


    def function_register(self, cr, uid, ids, field_name, arg, context=None):
        res = {}
        list_obj = self.pool.get('ctsv.sinhvien.phongtrao')
        for obj in self.browse(cr, uid, ids, context=context):
            res[obj.id] = 'close'
            svpt_ids = list_obj.search(cr, uid, [('pt.id', '=', obj.id), ('student.id', '=', uid),], context=context)
            if svpt_ids:
               res[obj.id] = 'register'
        return res
    
    _name = 'ctsv.phongtrao.temp'
    _columns = {
        'name' : fields.char('Tên phong trào', size = 64, required = True),
        'mark' : fields.float('Điểm', digits=(12,2)),
        'description' : fields.char('Mô tả', size = 700, required = False),
        'list_id': fields.many2one('ctsv.phongtrao.list', string='Danh sách phong trào'),
        'lpt_id': fields.many2one('ctsv.loaiphongtrao', string='Loại phong trào'),
        'date_start': fields.date('Ngày bắt đầu đăng ký'),
        'date_end': fields.date('Ngày kết thúc đăng ký'),
#        'state': fields.selection((('register', _('Đã đăng ký')),
#                                 ('close', _('Chưa đăng ký')),), string='Trạng thái', required = True),
        'state': fields.function(function_register, method=True, string='Trạng thái', type='selection',
                                    selection=(('register', _('Đã đăng ký')),
                                               ('close', _('Chưa đăng ký')),)),
        }
    _defaults = {
             'state': lambda *a: 'close'
            }
    _order = 'mark asc'
    
    def button_register(self, cr, uid, ids, context=False):
        sv_pt_obj = self.pool.get('ctsv.sinhvien.phongtrao')
        user_obj = self.pool.get('res.users')
        current_user = user_obj.browse(cr, uid, uid, context=context)
        vals = {
            'student': current_user.id,
            'name': current_user.name, 
            'code': current_user.code,
            'pt': ids[0],
            'tham_gia': False,
            }
        sv_pt_obj.create(cr, uid, vals, context=context)
        self.write(cr, uid, ids, {'state': 'register'}, context=context)
        return True
    
    def migrate_register(self, cr, uid, ids, stdid, context=False):
        sv_pt_obj = self.pool.get('ctsv.sinhvien.phongtrao')
        user_obj = self.pool.get('res.users')
        logging.info('----stdid: %s', stdid)
        if stdid:
            current_user = user_obj.browse(cr, uid, stdid, context=context)
            vals = {
                'student': current_user.id,
                'name': current_user.name, 
                'code': current_user.code,
                'pt': ids[0],
                'tham_gia': True,
                }
            sv_pt_obj.create(cr, uid, vals, context=context)
            self.write(cr, uid, ids, {'state': 'register'}, context=context)
        return True
    
    def button_close(self, cr, uid, ids, context=False):
        sv_pt_obj = self.pool.get('ctsv.sinhvien.phongtrao')
        deleted_ids = sv_pt_obj.search(cr, uid, [('student.id', '=', uid), ('pt.id', '=', ids[0])], context=context)
        sv_pt_obj.unlink(cr, uid, deleted_ids, context=None)
        self.write(cr, uid, ids, {'state': 'close'}, context=context)
        return True
    
PhongTrao_Temp()

class PhongTrao(osv.osv):
    
    def check_existing(self, cr, uid, vals, context):
        if  vals.has_key('date_start') and not vals.has_key('date_end'):
            raise osv.except_osv(_('Thông báo!'), _('Nhập ngày kết thúc đăng ký!'))
        if  vals.has_key('date_end') and not vals.has_key('date_start'):
            raise osv.except_osv(_('Thông báo!'), _('Nhập ngày bắt đầu đăng ký!'))
        if  vals.has_key('date_end') and vals.has_key('date_start'):
            now = time.strftime('%m/%d/%Y')
            if vals['date_end'] < now:
                raise osv.except_osv(_('Thông báo!'), _('Ngày kết thúc nhỏ hơn ngày hiện tại!'))
            if vals['date_start'] < now:
                raise osv.except_osv(_('Thông báo!'), _('Ngày bắt đầu nhỏ hơn ngày hiện tại!'))
            if vals['date_end'] < vals['date_start']:
                raise osv.except_osv(_('Thông báo!'), _('Ngày kết thúc nhỏ hơn ngày bắt đầu!'))
        pass
    
    def create(self, cr, uid, vals, context=None):
        logging.info('----Vals: %s', vals.keys())
        self.check_existing(cr, uid, vals, context)
        super(PhongTrao, self).create(cr, uid, vals, context=context)
        pt_temp_obj = self.pool.get('ctsv.phongtrao.temp')
        new_id = pt_temp_obj.create(cr, uid, vals, context=context)
        logging.info('----New_Id: %s', new_id)
        return new_id

    def write(self, cr, uid, ids, vals, context=None):
        logging.info('----vals for update---- : %s ', vals.keys())
        pt_temp_obj = self.pool.get('ctsv.phongtrao.temp')
        pt_temp_obj.write(cr, uid, ids, vals, context=context)
        return super(PhongTrao, self).write(cr, uid, ids, vals, context=context)
    
    def unlink(self, cr, uid, ids, context=None):
        logging.info('----ids for deleting---- : %s ', ids)
        res = super(PhongTrao, self).unlink(cr, uid, ids, context=context)
        pt_temp_obj = self.pool.get('ctsv.phongtrao.temp')
        pt_temp_obj.unlink(cr, uid, ids, context=context)
        return res
    
    def get_all_lines(self, cr, uid, id, context=False):
        result = []
        list_obj = self.pool.get('ctsv.sinhvien.phongtrao')
        ids = list_obj.search(cr, uid, [('pt.id', '=', id)], context=context)
        if ids:
            stt = 0
            for i in ids:
                obj = list_obj.browse(cr, uid, i, context=context)
                stt += 1
                mssv = obj.student.code
                hoten = obj.student.name
                logging.info('---- mssv, hoten : %s -- %s ', mssv, hoten)
                result.append([stt,
                               mssv,
                               hoten,])
        return result
    _name = 'ctsv.phongtrao'
    _description = 'Phong trao'
    _columns = {
        'name' : fields.char('Tên phong trào', size = 64, required = True),
        'mark' : fields.float('Điểm', digits=(12,2)),
        'description' : fields.char('Mô tả', size = 700, required = False),
        'list_id': fields.many2one('ctsv.phongtrao.list', string='Danh sách phong trào'),
        'lpt_id': fields.many2one('ctsv.loaiphongtrao', string='Loại phong trào'),
        'date_start': fields.date('Ngày bắt đầu đăng ký'),
        'date_end': fields.date('Ngày kết thúc đăng ký'),
#        'publish': fields.boolean('Đăng'),
        }
    _defaults = {}
    _order = 'mark asc'
    
PhongTrao()

class PhongTrao_list(osv.osv):
 
    def check_existing(self, cr, uid, semester_id, context):
        logging.info('----semester for checking phongtrao existing---- : %s ', semester_id)
        if semester_id:
            existing = self.search(cr, uid, [('academic_semester', '=', semester_id)], context=context)
            if existing: raise osv.except_osv(_('Thông báo!'), _('Đã tồn tại danh sách phong trào cho học kì này!'))
        pass
    
    
    def create(self, cr, uid, vals, context=None):
        logging.info('----Vals: %s', vals.keys())
#        logging.info('----Vals: %s', vals['dsphongtrao'])
        semester = vals.get('academic_semester', False)
        self.check_existing(cr, uid, semester, context=context)
        new_id = super(PhongTrao_list, self).create(cr, uid, vals, context=context)
        logging.info('----New_Id: %s', new_id)
        return new_id
    
    def write(self, cr, uid, ids, vals, context=None):
        logging.info('----Vals---- : %s ', vals.keys())
        logging.info('----Vals: %s', vals['dsphongtrao'])
        semester = vals.get('academic_semester', False)
        self.check_existing(cr, uid, semester, context=context)
        return super(PhongTrao_list, self).write(cr, uid, ids, vals, context=context)
    
    _name = 'ctsv.phongtrao.list'
    _columns = {
        'name': fields.char('Tên danh sách phong trào', size=64, required=True),
        'academic_semester': fields.many2one('aas.academic.semester', string='Học kỳ', required=True),
        'dsphongtrao': fields.one2many('ctsv.phongtrao', 'list_id', string='Danh sách phong trào'),
        }
    _defaults = {
        'name': lambda *a: 'named',
        }
    
PhongTrao_list()

class SinhVien_PhongTrao(osv.osv):
    _name = 'ctsv.sinhvien.phongtrao'
    _description = 'Danh sach sinh vien dang ky phong trao'
    _columns = {
                'student': fields.many2one('res.users', string='Sinh viên', domain=[('type', '=', 'student')], readonly=True, required = True),
                'name': fields.char('Họ tên', size=64),
                'code': fields.char('Mã số', size=64),
                'pt': fields.many2one('ctsv.phongtrao', string='Phong trào', readonly=True, required = True),
                'tham_gia': fields.boolean('Tham gia'),
        }
    _defaults = {
         'tham_gia': lambda *a: False,       
            }
    
    def get_drl_result(self, cr, uid, student_id, semester_id, context=None):
        res = 0
        pt = {}
        if student_id: 
            ids = self.search(cr, uid, [('student.id', '=', student_id), ('pt.list_id.academic_semester.id', '=', semester_id), ('tham_gia', '=', True)], context=context)
            logging.info('----drl ids : %s ',ids)
            if ids: 
                for obj in self.browse(cr, uid, ids, context=context):
                    if not pt.has_key(obj.pt.lpt_id.id):
                        pt.update({obj.pt.lpt_id.id: obj.pt.mark})
                    else:
                        if pt[obj.pt.lpt_id.id] + obj.pt.mark < obj.pt.lpt_id.total_mark:
                            pt[obj.pt.lpt_id.id] += obj.pt.mark
                        else:
                            pt[obj.pt.lpt_id.id] = obj.pt.lpt_id.total_mark
                for p in pt.keys():
                    res += pt[p]
                if res <= 0: res = 0
                if res > 100: res = 100
        return res
        
    
SinhVien_PhongTrao()


class phongtrao_register(osv.TransientModel):
    _name = 'ctsv.phongtrao.register'
    _columns = {
        'phongtrao_ids': fields.many2many('ctsv.phongtrao.temp', 'pt_reg_rel', 'ds_id', 'pt_id', string='Danh sách', readonly=True),
        'readonly': fields.boolean('', readonly=True),
    }
    _defaults = {  
        'readonly': lambda *a: True,
    }
    
    def default_get(self, cr, uid, fields, context=False):
        now = time.strftime('%m/%d/%Y')
        logging.info('------- NOW:  %s', now)
        res = super(phongtrao_register, self).default_get(cr, uid, fields, context=context)
        list_obj = self.pool.get('ctsv.phongtrao.temp')
        ids = list_obj.search(cr, uid, [('date_end', '>=', now), ('date_start', '<=', now)], context=context)
        logging.info('------- gt NOW ids:  %s', ids)
        res.update({'phongtrao_ids': ids})
        return res
    
phongtrao_register()

class phongtrao_danhsachthamgia(osv.TransientModel):
    _name = 'ctsv.phongtrao.danhsachthamgia'
    _columns = {
        'sv_pt_ids': fields.many2many('ctsv.sinhvien.phongtrao', 'sv_pt_rel', 'ds_id', 'sv_pt_id', string='Danh sách', readonly=True),
        'readonly': fields.boolean('', readonly=True),
    }
    _defaults = {  
        'readonly': lambda *a: True,
    }
    
    def default_get(self, cr, uid, fields, context=False):
        res = super(phongtrao_danhsachthamgia, self).default_get(cr, uid, fields, context=context)
        id = context.get('active_id', False)
        logging.info('---- ACTIVE ID:  %s',id)
        self.list_id = False
        if id:
            list_obj = self.pool.get('ctsv.sinhvien.phongtrao')
            ids = list_obj.search(cr, uid, [('pt.id', '=', id)], context=context)
            logging.info('------- ids rel:  %s',ids)
            res.update({'sv_pt_ids': ids})
            
            if ids:
                sql = '''
                    SELECT pt
                    FROM ctsv_sinhvien_phongtrao
                    WHERE id = %s
                '''
                cr.execute(sql, (ids[0],))
                if cr.rowcount > 0:
                    self.list_id = cr.fetchone()[0]
                    logging.info('---- list_id:  %s',self.list_id)
        return res

    def print_report(self, cr, uid, ids, context=False):
        datas = {}
        if not self.list_id:
            raise osv.except_osv(_('Thông báo!'), _("Không thể tải bản in!"))
        logging.info('------- list_id rel:  %s',self.list_id)
        datas['id'] = self.list_id
        datas['ids'] = [self.list_id]
        datas['model'] = 'ctsv.phongtrao'
        logging.info('------- data rel:  %s',datas)
        return {
            'type': 'ir.actions.report.xml', 
            'report_name': 'ctsv_dsthamgia_report', 
            'datas': datas
        }    
phongtrao_danhsachthamgia()

class ctsv_pt_detail(osv.TransientModel):
    _name = 'ctsv.pt.detail'
    _columns = {
        'result_id': fields.many2one('ctsv.drl.result', string='DRL Result', required=False),
        'name' : fields.char('Tên phong trào', size = 64, required = True),
        'mark' : fields.float('Điểm', digits=(12,2)),
        'description' : fields.char('Mô tả', size = 700, required = False),
        'lpt_id': fields.many2one('ctsv.loaiphongtrao', string='Loại phong trào'),
        'date_start': fields.date('Ngày bắt đầu đăng ký'),
        'date_end': fields.date('Ngày kết thúc đăng ký'),
    }
    _defaults = {
    }

    def get_all_lines(self, cr, uid, id, context=False):
        result = []
        ids = self.search(cr, uid, [('result_id.id', '=', id)], context=context)
        if ids:
            stt = 0
            for i in ids:
                obj = self.browse(cr, uid, i, context=context)
                stt += 1
                name = obj.name
                mark = obj.mark
                description = obj.description
                lpt = obj.lpt_id.name
                date_start = obj.date_start
                date_end = obj.date_end
                logging.info('---- name, mark : %s -- %s ', name, mark)
                result.append([stt,
                               name,
                               mark,
                               description,
                               lpt,
                               date_start,
                               date_end,])
        return result   

ctsv_pt_detail()

class ctsv_drl_result(osv.TransientModel):
    _name = 'ctsv.drl.result'
    _description = 'Kết quả điểm rèn luyện'
    _columns = {
        'student_id': fields.many2one('res.users', string='Sinh viên', domain=[('type', '=', 'student')], required=True),
        'year': fields.many2one('aas.academic.year', string='Năm học'),
        'semester': fields.many2one('aas.academic.semester', string='Học kỳ'),
        'readonly': fields.boolean('Readonly'),
        'details': fields.one2many('ctsv.pt.detail', 'result_id', string='Chi tiết', readonly=True),
        'drl': fields.integer('Điểm rèn luyện', readonly=True),
    }
    _defaults = {
    }
    _order = 'year,semester'
    
    def default_get(self, cr, uid, fields, context=False):
        res = super(ctsv_drl_result, self).default_get(cr, uid, fields, context=context)
        id = context.get('active_id', False)
        self.list_id = False
        year_id = False
        semester_id = False
        student_id = uid
        if id:
            self.list_id = id
            obj = self.browse(cr, uid, id, context=context)
            year_id = obj.year and obj.year.id or False
            semester_id = obj.semester and obj.semester.id or False
            student_id = obj.student_id.id or uid
        sv_pt_obj = self.pool.get('ctsv.sinhvien.phongtrao')
        drl = sv_pt_obj.get_drl_result(cr, uid, student_id, semester_id, context=context)
        details = []
        svpt_ids = sv_pt_obj.search(cr, uid, [('pt.list_id.academic_semester.id', '=', semester_id), ('student.id', '=', student_id), ('tham_gia', '=', True)], context=context)
        if svpt_ids:
            for obj in sv_pt_obj.browse(cr, uid, svpt_ids, context=context):
                detail_data = {
                        'name': obj.pt.name,
                        'mark': obj.pt.mark,
                        'description': obj.pt.description,
                        'lpt_id': obj.pt.lpt_id.id,
                        'date_start': obj.pt.date_start,
                        'date_end': obj.pt.date_end,
                        }
                details.append(detail_data)
        res.update({'readonly': True,
                    'semester': semester_id,
                    'year': year_id,
                    'student_id': student_id,
                    'details': details,
                    'drl': drl,
                    })
        return res
        
    def print_result(self, cr, uid, ids, context=None):
        datas = {}
        if not self.list_id:
            raise osv.except_osv(_('Thông báo!'), _("Không thể tải bản in!"))
        logging.info('------- list_id rel:  %s',self.list_id)
        datas['id'] = self.list_id
        datas['ids'] = [self.list_id]
        datas['model'] = 'ctsv.pt.detail'
        logging.info('------- data rel:  %s',datas)
        return {
            'type': 'ir.actions.report.xml', 
            'report_name': 'ctsv_drl_result_report', 
            'datas': datas
        }   
    
    def update_result(self, cr, uid, ids, context=None):
        return {
            'name': _('Chi tiết kết quả điểm rèn luyện'),
            'view_type': 'form',
            'view_mode': 'form',
            'res_model': 'ctsv.drl.result',
            'type': 'ir.actions.act_window',
            'target': 'new',
        }
        
    def get_all_lines(self, cr, uid, id, context=False):
        result = []
        obj = self.browse(cr, uid, id, context=context)
        if obj:
            stt = 0
            sv_pt_obj = self.pool.get('ctsv.sinhvien.phongtrao')
            svpt_ids = sv_pt_obj.search(cr, uid, [('pt.list_id.academic_semester.id', '=', obj.semester.id), ('student.id', '=', obj.student_id.id), ('tham_gia', '=', True)], context=context)
            if svpt_ids:
                for svpt_obj in sv_pt_obj.browse(cr, uid, svpt_ids, context=context):
                    stt += 1
                    result.append([stt,
                               svpt_obj.pt.name,
                               svpt_obj.pt.mark,
                               svpt_obj.pt.description,
                               svpt_obj.pt.lpt_id.name,
                               svpt_obj.pt.date_start,
                               svpt_obj.pt.date_end,])
        return result   
    
ctsv_drl_result()




